#pragma once
#include <iostream>
#include <fstream>
class util
{
public:
    static std::string readFile(const std::string &path)
    {
        // version-1 如果文件不是字符流就会出现问题
        // std::ifstream in(path);
        // if(!in)
        // {
        //     std::cerr<<"路径错误,读取失败"<<std::endl;
        //     return "";
        // }
        // std::string line;
        // std::string ret;
        // while(std::getline(in,line))//笨方法,有更好的方法可以一次读完,以后再学
        // {
        //     ret+=line;
        // }
        // return ret;
        //++++++++++++++++++++++++++
        //调试时使用的
        // std::cout << "=== 文件读取调试信息 ===" << std::endl;
        // std::cout << "路径: [" << path << "]" << std::endl;
        // std::cout << "路径长度: " << path.length() << std::endl;

        // // 检查文件是否存在
        // std::ifstream test(path);
        // std::cout << "文件可访问: " << (test.good() ? "是" : "否") << std::endl;
        // if (test.good())
        // {
        //     test.close();
        // }
         // version-2 建立字符缓冲区处理 将送进来的内容原封不动送出
        int fileSize = util::fileSize(path);
        if (fileSize > 0)
        {
            std::string ret;
            ret.resize(fileSize);
            std::ifstream in(path, std::ios::binary);//一定要是开启了读权限的文件流
            if (!in.is_open())
            {
                std::cerr << "打开文件失败: " << path << std::endl;
                return "";
            }
            in.read(&ret[0], fileSize);
            if (in.gcount() != fileSize)
            {
                std::cerr << "读取文件不完整: " << in.gcount() << "/" << fileSize << std::endl;
                ret.resize(in.gcount());
            }
            in.close();
            return ret;
        }
        return "";
    }
    static std::string readOneLine(std::string &msg, const std::string &sep)
    {
        int pos = 0;
        pos = msg.find_first_of("\n", 0);
        std::string ret;
        ret = msg.substr(0, pos);        // c++的string对象无需\0
        msg.erase(0, pos + sizeof(sep)); // 将读取到的那一行删除方便下次读取
        return ret;
    }
    static int fileSize(const std::string &path)
    {
        std::ifstream in(path, std::ios::binary);
        if (!in.is_open())
            return -1;
        in.seekg(0, in.end);       // 将文件中的访问指针调到文件的末尾
        int fileSize = in.tellg(); // 返回文件指针的所在位置(不是从0开始的 而是走过的字节数 所以不用加一)
        in.seekg(0, in.beg);
        in.close();
        std::cout << path << " size is " << fileSize << std::endl;
        return fileSize;
    }
};